/**
 * 了解 js的赋值 调用  赋值 和访问 调用了 从Object 获取的get set 操作 ，自定义进行覆盖
 * 通过表达式赋值 之后，如果不赋值 给  get 需要的变量，还是旧的值 ，例如 a.b = 333 重新在控制台 输出还是旧的值
 * @type {{b: number, c: number}}
 */
var a={
  b:1,
  c:2
}

var returVal = a.b;
//console.log(Object.getOwnPropertyDescriptor(a,"b"))
Object.defineProperty(a,"b",{
  get:function(){
    console.log("get");
    return returVal;
  },
  set:function(newValue){
    console.log("set" + newValue);
    //returVal = newValue;  //不写这句访问a.b 旧的值 写了新的值
  }
})
a.b=333
console.log(a.b)

/**
 * 快捷设置 变量的访问权
 */
//Object.freeze(a,"b");  //封印变量  可以通过过下面代码查询 Object.freeze() 方法可以冻结一个对象，
////冻结指的是不能向这个对象添加新的属性，不能修改其已有属性的值，不能删除已有属性，以及不能修改该对象已有属性的可枚举性、可配置性、可写性。也就是说，这个对象永远是不可变的。该方法返回被冻结的对象。
//console.log(Object.getOwnPropertyDescriptor(a,"b")) //能否枚举，访问 修改等权限
//Object.seal(a,"b")
//
////下面，我们分别介绍下对象属性的描述对象的4个属性：
//1.configurable：表示能否通过delete删除此属性，能否修改属性的特性，或能否修改把属性修改为访问器属性，如果直接使用字面量定义对象，默认值为true

//2.enumerable: 表示该属性是否可枚举，即是否通过for-in循环或Object.keys()返回属性，如果直接使用字面量定义对象，默认值为true

//3.writable: 能否修改属性的值，如果直接使用字面量定义对象，默认值为true
//4.value: 该属性对应的值，默认为undefined
